class A {
    interface B{
        void f();
    }
    public class BImp implements B {
        public void f() {}
    }
    private class BImp2 implements B {
        public void f() {}
    }
    public interface C {
        void f();
    }
    class CImp implements C {
        public void f() {}
    }
    private class CImp2 implements C {
        public void f() {}
    }
    private interface D {
        void f();
    }
    private class DImp implements D {
        public void f() {}
    }
    public class DImp2 implements D {
        public void f() {}
    }
    public D getD() {return new DImp2();}   /*返回一个私有接口D的实现类DImp2的对象的引用*/
    private D dRef;     /*类A的成员，一个D完全抽象类（接口）的对象*/
    public void recieveD(D d) {
        dRef = d;
        dRef.f();
    }
}

interface E {
    interface G {   /*嵌套接口*/
        void f();
    }
    public interface H {
        void f();
    }
    void g();
    /*在一个接口中不可以定义一个私有接口（因为使用外部接口时不会继承内部接口，只会继承外部接口的方法。而private接口又只能通过外部接口访问）*/
}

public class NestingInterfaces {
    public class BImp implements A.B {  /*类中的公有接口可以通过点号运算符访问，直接使用*/
        public void f() {}
    }
    class CImp implements A.C {
        public void f() {}
    }
    /*只能在定义这个接口的类中使用私有接口
    class DImp implements A.D {
        public void f() {}
    }
    */
    class EImp implements E {
        public void g() {}
    }
    class EGImp implements E.G {
        public void f() {}
    }
    class EImp2 implements E {
        public void g() {}
        class EG implements E.G {
            public void f() {}
        }
    }
    public static void main(String[] args) {
        A a = new A();
        /*不能访问A.D   A.D ad = a.getD();
          不能返回除了A.D外的值 A.DImp2 di2 = a.getD();
          不能访问接口中的成员  a.getD().f();
          只有另一个A对象可以使用getD()的返回值*/
        A a2 = new A();
        a2.recieveD(a.getD());
        System.out.println("Successful!");
    }
}
